Index: Lib/base64.py =================================================================== --- Lib/base64.py (revision 74244) +++ Lib/base64.py (working copy) @@ -84,6 +84,8 @@ % altchars.__class__.__name__) assert len(altchars) == 2, repr(altchars) s = _translate(s, {chr(altchars[0]): b'+', chr(altchars[1]): b'/'}) + if re.search(b'[^A-Za-z0-9/=+\r\n]', s): + raise TypeError('Non-base64 digit found: %s' % s) return binascii.a2b_base64(s) Index: Lib/test/test_base64.py =================================================================== --- Lib/test/test_base64.py (revision 74244) +++ Lib/test/test_base64.py (working copy) @@ -137,7 +137,18 @@ self.assertRaises(TypeError, base64.urlsafe_b64decode, "") def test_b64decode_error(self): - self.assertRaises(binascii.Error, base64.b64decode, b'abc') + ar = self.assertRaises + ar(binascii.Error, base64.b64decode, b'abc') + # Test some invalid characters; addresses [1466065]. + ar(TypeError, base64.b64decode, b'%3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'$3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'[3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b']3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'{3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'}3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'@3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'!3d3LnB5dGhvbi5vcmc=') + ar(TypeError, base64.b64decode, b'#3d3LnB5dGhvbi5vcmc=') def test_b32encode(self): eq = self.assertEqual